Skip to content

Conversation

@cj-vana
Copy link
Collaborator

@cj-vana cj-vana commented Oct 24, 2025

PR Type

Enhancement, Bug fix


Description

  • Comprehensive lens calculator system: Introduces advanced projection lens scoring with 6 use-case profiles (cinema, presentation, bright_venue, outdoor, mapping, museum, simulation), throw ratio validation, brightness calculations, and environmental suitability scoring

  • Real-time collaboration features: Implements collaborative document editing with presence tracking, auto-save with debouncing and offline support, and Supabase Realtime integration for multi-user synchronization

  • Technical rider management: Adds complete technical rider document system with band member tracking, equipment requirements, backline items, and PDF export functionality

  • Audio signal generation: New signal generator module supporting sine, sweep, and colored noise types with phase-continuous generation for test signal capabilities

  • Mount and manufacturer compatibility: Introduces comprehensive mount compatibility validation system and manufacturer normalization with fuzzy matching for cross-region projector/lens matching

  • Ultra Short Throw (UST) calculations: New UST lens calculation system handling zero-offset, negative-offset, mirror-based configurations with barrel distortion and keystone correction

  • Memory-optimized DSP: Implements memory-aware LRU caching for audio processing with configurable memory limits and improved FFT plan lifecycle management

  • Shell command safety: Fixes potential shell injection vulnerabilities in lint-staged configuration with proper file path escaping

  • SEO and metadata updates: Enhanced metadata for technical rider and tour planning features with version bump to 1.5.6.8

  • Support link update: Changed support link from Stripe to Buy Me a Coffee


Diagram Walkthrough

flowchart LR
  A["Lens Calculator<br/>System"] -->|"Scoring & Mount<br/>Compatibility"| B["Enhanced<br/>Lens Evaluation"]
  C["Collaboration<br/>Features"] -->|"Auto-save &<br/>Presence"| D["Real-time<br/>Document Sync"]
  E["Technical<br/>Rider Mgmt"] -->|"PDF Export"| F["Rider<br/>Documents"]
  G["Audio Signal<br/>Generator"] -->|"Test Signals"| H["Capture<br/>Agent"]
  I["DSP<br/>Optimization"] -->|"Memory<br/>Management"| H
  J["Manufacturer &<br/>Mount Data"] -->|"Compatibility<br/>Validation"| B
Loading

File Walkthrough

Relevant files
Enhancement
25 files
lensScoring.enhanced.ts
Enhanced Lens Scoring with Multi-Use-Case Support               

apps/web/src/lib/lensScoring.enhanced.ts

  • Introduces comprehensive enhanced lens scoring system with 6 new
    use-case profiles (cinema, presentation, bright_venue, outdoor,
    mapping, museum, simulation)
  • Implements advanced scoring components including throw ratio
    validation, brightness calculations with ANSI/Center conversion,
    elliptical lens shift modeling, and UST handling
  • Adds environmental suitability scoring with temperature, humidity, and
    dust resistance factors
  • Provides detailed scoring breakdown with warnings, recommendations,
    and installation guidance
+1053/-0
lensCalculatorUtils.ts
Lens Calculator Utilities with Database Integration           

apps/web/src/lib/lensCalculatorUtils.ts

  • Adds database query functions for fetching projectors, compatible
    lenses, and user calculations with filtering support
  • Implements enhanced calculation result interface with scoring insights
    and category analysis
  • Provides helper functions for brightness calculations, shift
    feasibility checking, and UST detection
  • Includes legacy scoreLens function for backward compatibility and new
    calculateCompatibleLensesEnhanced with comprehensive scoring
+722/-0 
lensScoring.ts
Phase E Comprehensive Lens Scoring Algorithm                         

apps/web/src/lib/lensScoring.ts

  • Implements Phase E comprehensive lens scoring algorithm with detailed
    component breakdown
  • Defines scoring profiles for cinema, presentation, bright venue, and
    outdoor use cases with configurable weights and penalties
  • Provides core scoring functions for throw ratio, brightness, lens
    shift, ergonomics, and special features
  • Returns detailed ScoringBreakdown interface with compatibility levels
    and actionable recommendations
+699/-0 
useAutoSave.ts
Auto-Save Hook with Debouncing and Offline Support             

apps/web/src/hooks/useAutoSave.ts

  • Implements React hook for auto-saving document changes with debouncing
    and offline support
  • Handles optimistic concurrency control using version tracking and
    field-level updates
  • Provides remote update detection to prevent autosave triggers on
    incoming changes
  • Includes comprehensive error handling, save status tracking, and
    beforeunload warnings
+674/-0 
manufacturerNormalization.ts
Manufacturer Normalization with Fuzzy Matching                     

apps/web/src/lib/manufacturerNormalization.ts

  • Introduces manufacturer normalization system with fuzzy matching using
    Levenshtein distance
  • Handles manufacturer aliases, regional variations, and acquisition
    mappings (e.g., Sharp acquired by NEC)
  • Provides regional model equivalents for cross-region projector/lens
    matching
  • Implements manufacturer compatibility validation with confidence
    scoring and cross-manufacturer warnings
+469/-0 
mountCompatibility.ts
Projector and Lens Mount Compatibility Validation System 

apps/web/src/lib/mountCompatibility.ts

  • New comprehensive mount compatibility validation system for projector
    and lens mounts
  • Implements compatibility matrix covering Barco, Christie, Panasonic,
    Epson, Sony, NEC/Sharp, and Digital Projection systems
  • Provides adapter information, performance impact analysis, and
    cross-manufacturer compatibility checking
  • Includes legacy mount mapping and mount family classification for
    broader compatibility assessment
+721/-0 
ustCalculations.ts
Ultra Short Throw Projector Lens Calculations and Mounting

apps/web/src/lib/ustCalculations.ts

  • New UST (Ultra Short Throw) lens calculation and mounting system
  • Handles zero-offset, negative-offset, mirror-based, and standard UST
    configurations
  • Calculates barrel distortion, keystone correction requirements, and
    critical positioning tolerances
  • Provides UST classification, compatibility validation, and optimal
    installation parameter calculations
+446/-0 
collaborativeDocStore.ts
Real-time Collaborative Document Editing Store                     

apps/web/src/stores/collaborativeDocStore.ts

  • New Zustand store for real-time collaborative document editing with
    presence tracking
  • Manages connection state, document synchronization, and auto-save
    functionality
  • Implements offline queue syncing, remote update handling, and
    reconnection logic
  • Provides selector hooks for optimized component re-renders
+542/-0 
autoSave.ts
Auto-save with Debouncing and Offline Support                       

apps/web/src/lib/autoSave.ts

  • New auto-save utilities with debouncing, retry logic, and version
    conflict detection
  • Supports both authenticated and shared resource save paths with
    offline queue fallback
  • Implements batch saves, exponential backoff retries, and version
    history snapshots
  • Handles document type to resource type mapping and timestamp field
    normalization
+482/-0 
collaboration.ts
Real-time Collaboration with Supabase Realtime Channels   

apps/web/src/lib/collaboration.ts

  • New collaboration utilities for real-time document editing via
    Supabase Realtime
  • Manages broadcast channels for field updates and presence channels for
    user tracking
  • Implements user color assignment, presence state parsing, and channel
    health checking
  • Provides reconnection handling and sync request broadcasting
+360/-0 
lensCalculatorTypes.ts
Projection Lens Calculator Type Definitions                           

apps/web/src/lib/lensCalculatorTypes.ts

  • New comprehensive type definitions for projection lens calculator
    system
  • Defines interfaces for projectors, lenses, screen data, and
    calculation results
  • Includes unit conversion functions, validation helpers, and common
    presets for aspect ratios and screen sizes
  • Provides manufacturer and technology type constants
+328/-0 
offlineQueue.ts
Offline Queue Management with IndexedDB                                   

apps/web/src/lib/offlineQueue.ts

  • New offline queue management using IndexedDB via localforage
  • Queues document saves when offline and syncs when connection is
    restored
  • Implements queue pruning for stale items, statistics tracking, and
    availability checking
  • Supports document-specific queue operations and retry attempt tracking
+255/-0 
collaboration.ts
Collaboration and Auto-save Type Definitions                         

apps/web/src/types/collaboration.ts

  • New comprehensive TypeScript type definitions for real-time
    collaboration and auto-save
  • Defines types for save status, presence users, broadcast payloads, and
    document updates
  • Includes conflict resolution strategies, version history, and
    auto-save configuration types
  • Provides collaboration channel and setup options interfaces
+266/-0 
shareUtils.ts
Share Utils Enhancement for Technical Riders and RLS Bypass

apps/web/src/lib/shareUtils.ts

  • Extended ResourceType to include technical_rider support
  • Updated getSharedResource to handle technical_rider table and
    edit-mode Run of Show links
  • Modified updateSharedResource to use RPC function for bypassing RLS
    with SECURITY DEFINER
  • Enhanced type safety with Record instead of any for
    data objects
+63/-39 
usePresence.ts
React Hook for Collaborative Presence Tracking                     

apps/web/src/hooks/usePresence.ts

  • New React hook for presence tracking in collaborative editing
  • Implements throttled cursor position and editing field updates
  • Provides helper hook for tracking text input cursor position
  • Includes cleanup logic for presence state on unmount
+252/-0 
useCollaboration.ts
Real-time collaboration hook for document editing               

apps/web/src/hooks/useCollaboration.ts

  • New React hook for real-time collaboration managing Broadcast and
    Presence channels
  • Handles active user tracking, connection status, and remote update
    callbacks
  • Implements proper cleanup and memoization to prevent unnecessary
    re-renders
  • Provides broadcast functionality for sending updates to other
    connected users
+221/-0 
supabase.ts
Supabase utility functions for data persistence                   

apps/web/src/lib/supabase.ts

  • Enhanced savePixelMap to return created data using .select().single()
  • Added new fetchUserCount function using RPC to count unique users
    across documents
  • Improved error handling with proper null returns for failed queries
+38/-11 
index.ts
Protocol support for signal generation and loopback           

packages/analyzer-protocol/src/index.ts

  • Added SignalGeneratorConfig interface for configurable test signal
    generation
  • Extended CaptureConfig with loopback and signal generator options
  • Added UpdateGeneratorMessage type for runtime signal generator updates
  • Updated ClientMessage union type to include generator update messages
+23/-1   
types.ts
Type definitions for technical rider documents                     

apps/web/src/lib/types.ts

  • Added comprehensive technical rider interfaces (BandMember,
    InputChannel, BacklineItem, StaffRequirement)
  • Created RiderForExport interface for complete technical rider document
    structure
  • Supports artist information, equipment requirements, and venue
    specifications
+59/-0   
server.py
Signal generation and improved WebSocket connection handling

agents/capture-agent-py/capture_agent/server.py

  • Implemented signal generator integration with full-duplex audio
    streaming for macOS compatibility
  • Added WeakSet for automatic cleanup of disconnected WebSocket clients
  • Enhanced error handling with connection state checks before sending
    messages
  • Improved capture task lifecycle management with proper cancellation
    and cleanup
  • Added dropped frame tracking and logging for audio quality monitoring
+357/-61
dsp.py
Memory-aware caching and DSP optimization                               

agents/capture-agent-py/capture_agent/dsp.py

  • Implemented memory-aware LRU cache decorator replacing
    functools.lru_cache
  • Added comprehensive memory tracking for work arrays and FFT plans with
    configurable limits
  • Enhanced FFT plan lifecycle management with periodic cleanup and
    memory thresholds
  • Improved type hints with proper TypedDict and Union type annotations
  • Optimized delay calculation with better array pre-allocation
+243/-51
signal_generator.py
Audio signal generator for test signals                                   

agents/capture-agent-py/capture_agent/signal_generator.py

  • New signal generator module supporting sine, sweep, and colored noise
    (white, pink, brown, blue, violet)
  • Implements phase-continuous signal generation for seamless playback
  • Pre-generates noise tables with crossfade looping for efficient
    runtime performance
  • Configurable output channels and amplitude with proper sample rate
    handling
+269/-0 
schema.py
Schema definitions for signal generation                                 

agents/capture-agent-py/capture_agent/schema.py

  • Added SignalGeneratorConfig Pydantic model for signal generation
    configuration
  • Extended CaptureConfig with loopback and generator options
  • Added UpdateGeneratorMessage for runtime generator configuration
    updates
  • Updated ClientMessage union to include new generator message type
+21/-2   
lens-calculator-worker.js
Web Worker for lens calculator processing                               

apps/web/public/lens-calculator-worker.js

  • New Web Worker for intensive lens evaluation calculations
  • Implements batch processing with progress updates to prevent UI
    blocking
  • Calculates lens compatibility scores based on throw ratio, brightness,
    and features
  • Generates warnings and recommendations for lens selection
+218/-0 
ProductionPage.tsx
Technical rider document management interface                       

apps/web/src/pages/ProductionPage.tsx

  • Added technical rider management UI with create, edit, delete, and
    export functionality
  • Integrated RiderExport and PrintRiderExport components for PDF
    generation
  • Implemented comprehensive PDF export with band members, input lists,
    backline requirements
  • Added rider state management and fetch logic alongside schedules and
    run-of-shows
+622/-8 
Miscellaneous
1 files
audio.py
Audio Buffer Overflow Handling Refactor                                   

agents/capture-agent-py/capture_agent/audio.py

  • Changed audio buffer overflow warning from print statement to silent
    pass
  • Adds comment indicating buffer overflow is tracked elsewhere
+1/-1     
Configuration changes
1 files
Footer.tsx
Update Support Link to Buy Me a Coffee                                     

apps/web/src/components/Footer.tsx

  • Updated support link from Stripe payment URL to Buy Me a Coffee
  • Changed href from Stripe checkout to buymeacoffee.com/sounddocs
+1/-1     
Documentation
2 files
index.html
SEO and metadata updates for technical riders                       

apps/web/index.html

  • Updated meta descriptions and keywords to include technical riders and
    tour planning
  • Added "Technical Rider Management" to feature list in schema.org
    markup
  • Updated software version to 1.5.6.8
  • Enhanced SEO keywords for rider-related searches
+9/-8     
research-analyst.md
Research analyst agent configuration                                         

.claude/agents/research-analyst.md

  • New agent configuration file for research and analysis tasks
  • Defines methodology for comprehensive information gathering and
    synthesis
  • Establishes quality standards, output structure, and communication
    principles
  • Includes domain expertise areas and ethical guidelines for research
+114/-0 
Bug fix
1 files
.lintstagedrc.js
Shell command safety improvements for lint-staged               

.lintstagedrc.js

  • Added shellEscape helper function to properly quote file paths in
    shell commands
  • Applied shell escaping to all file path arguments in ESLint and
    Prettier commands
  • Improved error messages for missing Python linting tools (ruff,
    sqlfluff)
  • Fixed potential shell injection vulnerabilities in file path handling
+20/-18 
Additional files
101 files
config.json +0/-3     
prompt +0/-5     
accessibility-auditor.md +132/-0 
agent-orchestrator.md +146/-0 
ai-engineer.md +137/-0 
angular-architect.md +140/-0 
api-architect.md +144/-0 
api-documenter.md +170/-0 
architecture-reviewer.md +138/-0 
backend-engineer.md +127/-0 
blockchain-developer.md +197/-0 
build-engineer.md +134/-0 
business-analyst.md +115/-0 
chaos-engineer.md +122/-0 
cli-developer.md +145/-0 
cloud-architect.md +104/-0 
code-reviewer.md +129/-0 
competitive-analyst.md +199/-0 
compliance-auditor.md +221/-0 
content-marketing-strategist.md +110/-0 
context-manager.md +118/-0 
cpp-expert.md +193/-0 
csharp-dotnet-expert.md +185/-0 
customer-success-manager.md +118/-0 
data-analyst.md +124/-0 
data-engineer.md +120/-0 
data-researcher.md +104/-0 
data-scientist.md +127/-0 
database-administrator.md +217/-0 
database-optimizer.md +149/-0 
debugger.md +201/-0 
dependency-manager.md +145/-0 
deployment-engineer.md +121/-0 
devops-engineer.md +174/-0 
devops-incident-responder.md +227/-0 
distributed-systems-architect.md +156/-0 
django-expert.md +216/-0 
documentation-engineer.md +113/-0 
dotnet-core-specialist.md +152/-0 
dotnet-framework-specialist.md +118/-0 
dx-optimizer.md +146/-0 
electron-pro.md +131/-0 
embedded-systems-engineer.md +210/-0 
error-coordinator.md +186/-0 
error-detective.md +120/-0 
fintech-engineer.md +202/-0 
flutter-specialist.md +234/-0 
fullstack-feature-owner.md +190/-0 
game-developer.md +123/-0 
git-workflow-manager.md +143/-0 
go-expert.md +135/-0 
graphql-architect.md +177/-0 
incident-responder.md +156/-0 
iot-engineer.md +156/-0 
java-architect.md +145/-0 
javascript-expert.md +155/-0 
knowledge-synthesizer.md +122/-0 
kotlin-expert.md +140/-0 
kubernetes-specialist.md +141/-0 
laravel-specialist.md +141/-0 
legacy-modernizer.md +145/-0 
legal-advisor.md +122/-0 
llm-architect.md +185/-0 
market-researcher.md +130/-0 
mcp-protocol-expert.md +148/-0 
ml-deployment-engineer.md +151/-0 
ml-engineer.md +149/-0 
mlops-engineer.md +112/-0 
mobile-developer-crossplatform.md +152/-0 
mobile-developer.md +142/-0 
multi-agent-orchestrator.md +182/-0 
network-engineer.md +115/-0 
nextjs-expert.md +235/-0 
nlp-engineer.md +148/-0 
payment-integration-specialist.md +162/-0 
penetration-tester.md +165/-0 
performance-engineer.md +186/-0 
performance-monitor.md +292/-0 
php-expert.md +122/-0 
platform-engineer.md +122/-0 
postgres-expert.md +165/-0 
product-manager.md +100/-0 
project-manager.md +155/-0 
prompt-engineer.md +123/-0 
python-expert.md +269/-0 
qa-expert.md +224/-0 
quant-analyst.md +118/-0 
rails-specialist.md +189/-0 
react-specialist.md +219/-0 
refactoring-specialist.md +227/-0 
risk-manager.md +182/-0 
rust-systems-engineer.md +100/-0 
sales-engineer.md +145/-0 
scrum-master.md +125/-0 
search-specialist.md +132/-0 
security-auditor.md +128/-0 
security-infrastructure-engineer.md +129/-0 
seo-strategist.md +124/-0 
spring-boot-expert.md +143/-0 
sql-expert.md +116/-0 
Additional files not shown

- Replace "Professional Audio Documentation" with "Professional Event Documentation" across PDF exports
  (ProductionPage.tsx, AllProductionSchedules.tsx, AllRunOfShows.tsx, CommsPlannerEditor.tsx, AudioPage.tsx,
   AllTheaterMicPlots.tsx, AllPatchSheets.tsx, AllCorporateMicPlots.tsx, AllCommsPlans.tsx, PrintCommsPlanExport.tsx)
- Fix TS/ESLint in AllRunOfShows: type `onclone: Document` and cast html2canvas options to `any` to allow `letterRendering` (no behavior change)
- Bump root version to 1.5.6.4
Replace `any` types with proper TypeScript interfaces and fix
  unused variables across multiple page components:

  **Type Safety Improvements:**
  - AllCommsPlans.tsx: Added proper types for transceiver/beltpack
   data and jsPDF autoTable usage
  - AllCorporateMicPlots.tsx: Defined PresenterEntry interface,
  fixed HTML element casting
  - AllPatchSheets.tsx: Created comprehensive input/output entry
  types with connection details
  - AllRunOfShows.tsx: Added proper types for live show data and
  table structures
  - AllTheaterMicPlots.tsx: Replaced any types with ActorEntry and
   proper interfaces
  - AudioPage.tsx: Added extensive type definitions for all data
  structures and PDF generation
  - CommsPlannerEditor.tsx: Fixed property change handlers and
  autoTable type casting

  **Code Quality Fixes:**
  - Removed unused error variables in catch blocks across all
  files
  - Fixed HTML element style property access with proper casting
  - Replaced `any` type assertions with specific jsPDF interface
  extensions
  - Added proper error handling with instanceof Error checks

  **React Hooks:**
  - Added intentional eslint-disable comments for hooks
  dependencies that would cause unnecessary re-renders
  - Used useCallback for handleSave to prevent dependency cycles

  These changes eliminate 112+ ESLint errors while maintaining
  existing functionality and improving type safety throughout the
  codebase.
Fixed React hooks exhaustive-deps warning in CommsPlannerEditor
  component:

  - Wrapped runAssignmentLogic function in useCallback hook to
  prevent recreation on every render
  - Added proper dependencies (beltpacks, setBeltpacks) to
  useEffect dependency array
  - Prevents unnecessary re-renders and eliminates ESLint warning
  about missing dependencies

  This ensures the auto-assignment logic for
  beltpack-to-transceiver connections runs efficiently without
  causing performance issues or infinite re-render loops.
Add pnpm build as a prerequisite step before running pnpm dev in both the Quick Start and Detailed Setup Guide sections. This ensures users build the project before starting development.

  - Added step 6 "Build the Project" with `pnpm build` command
  - Renumbered subsequent steps in both sections
  - Maintains consistency between Quick Start and Detailed Setup
  Guide
Update PDF export footer text across all components and fix ESLint errors (reduce tech debt).
Commit Description:
  Version bump from 1.5.6.4 to 1.5.6.5 to include the new lens
  calculator feature.

  Changes:
  - Updated package.json version to 1.5.6.5
  - Updated softwareVersion in index.html JSON-LD schema to
  1.5.6.5
  - Added comprehensive changelog entry for lens calculator feature

  The lens calculator provides professional projection planning
tools with:
  - Throw distance and image size calculations
  - Multiple aspect ratio support (16:9, 16:10, 4:3, 21:9)
  - Preset lens configurations for common projectors
  - Interactive visual diagram for setup planning
  - Professional-grade accuracy for event production
- Fix React Hook useCallback warning in LensCalculatorV2
  - Replace 'any' types with proper TypeScript interfaces
  - Remove unused imports and variables
  - Remove destructive TRUNCATE statements from migration
  - Fix lens shift feasibility calculation bug
  - Replace hardcoded user ID with authenticated user
  - Fix duplicate part numbers in seed data
  - Add validation to prevent zero dimension calculations
…ional AV features

Complete redesign of the projector lens calculator with industry-grade accuracy and professional workflow.
…r list

- Remove keyboard shortcuts (Ctrl+1-4, Ctrl+K) and related UI hints
  - Require search input to display projectors - no default list shown
  - Tone down UI design to match sounddocs style:
    - Replace gradients with solid gray backgrounds
    - Simplify card designs and reduce shadows
    - Use consistent indigo color theme
    - Remove flashy visual effects
  - Maintain all functionality while improving design consistency
feat(lens-calculator): simplify UI design and remove default projector list
… state

- Replace direct numeric input values with string-based input state to prevent typing interference
  - Add separate string states for all numeric inputs (screenWidthInput, projectorDistanceInput, etc.)
  - Sync string inputs with numeric values via useEffect hooks
  - Update aspect ratio and preset handlers to maintain both string and numeric state
  - Fix issues where typing multi-digit numbers would get cut off or formatted prematurely
  - Resolve problems with select-all, backspace, and entering "0" values

   Now users can type naturally without interference from toFixed() formatting during input.
- Fix backspace and typing issues in all numeric inputs by using string-based state
  - Add typing state tracking to prevent cross-field interference during input
  - Round calculated fields to 1 decimal place to avoid long decimal chains
  - Allow empty inputs without auto-resetting to defaults
  - Cross-field updates only happen on blur, not during typing
  - Maintain aspect ratio calculations while preserving natural typing experience
fix(lens-calculator): resolve input handling issues with string-based state
Fix critical memory leaks in capture agent (FOR REAL THIS TIME!) and chart legend display issues

  - Fixed memory leaks in buffer pool, DSP cache, FFT plans, and WebSocket cleanup
  - Resolved QueueFull errors and improved connection handling stability
  - Updated websockets v12+ compatibility for better connection resilience
  - Fixed legend white fill consistency for magnitude/phase charts
  - Improved capture agent stability and reduced frame drops
  - Bumped capture agent version to 0.1.14
…rFunctionVisualizer

  - Replace 4 'any' types with proper TypeScript types (ScriptableLineSegmentContext, number | string)
  - Add missing dependencies (coherenceAlpha, coherenceThreshold) to React useMemo hooks
  - Maintains all existing functionality while improving type safety
  - Resolves 4 @typescript-eslint/no-explicit-any errors and 2 react-hooks/exhaustive-deps warnings
…sorry, it's my repo lol)

- Remove ruff linting and formatting checks from the GitHub Actions PR workflow.
- The Python checks job now only runs optional mypy type checking.
chore(version): v1.5.6.6 – fix memory leaks and chart legend consistency
cj-vana and others added 23 commits October 2, 2025 08:01
Major restructuring of agent documentation to improve naming consistency
and better reflect actual agent capabilities:

Renamed agents (better naming):
- accessibility-tester → accessibility-auditor
- agent-organizer → agent-orchestrator
- api-designer → api-architect
- architect-reviewer → architecture-reviewer
- backend-developer → backend-engineer
- content-marketer → content-marketing-strategist
- cpp-pro → cpp-expert
- csharp-developer → csharp-dotnet-expert
- django-developer → django-expert
- dotnet-core-expert → dotnet-core-specialist
- dotnet-framework-4.8-expert → dotnet-framework-specialist
- embedded-systems → embedded-systems-engineer
- flutter-expert → flutter-specialist
- frontend-developer → (removed - use react-specialist or ui-engineer)
- fullstack-developer → fullstack-feature-owner
- golang-pro → go-expert
- javascript-pro → javascript-expert
- kotlin-specialist → kotlin-expert
- machine-learning-engineer → ml-engineer
- mcp-developer → mcp-protocol-expert
- microservices-architect → distributed-systems-architect
- mobile-app-developer → mobile-developer-crossplatform
- multi-agent-coordinator → multi-agent-orchestrator
- nextjs-developer → nextjs-expert
- payment-integration → payment-integration-specialist
- php-pro → php-expert
- postgres-pro → postgres-expert
- python-pro → python-expert
- rails-expert → rails-specialist
- rust-engineer → rust-systems-engineer
- security-engineer → security-infrastructure-engineer
- seo-specialist → seo-strategist
- spring-boot-engineer → spring-boot-expert
- sql-pro → sql-expert
- test-automator → test-automation-engineer
- ui-designer → ui-ux-designer (+ new ui-engineer for implementation)
- vue-expert → vue-specialist
- websocket-engineer → websocket-architect
- wordpress-master → wordpress-architect (+ wordpress-expert)
- workflow-orchestrator → workflow-architect

Updated all agent definitions to follow consistent format with:
- Clear description field for Task tool usage examples
- Standardized model and color inheritance
- Improved use case examples and context
- Better integration guidelines

Removed README.md from agents directory (redundant with Task tool context).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Changed donation links from Stripe to Buy Me a Coffee across the site:
- Updated Footer donate link
- Updated Hero "Support the Project" link
- Updated GitHub FUNDING.yml

New donation URL: https://buymeacoffee.com/sounddocs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Fixed TypeScript ESLint error by replacing `any` type with proper
`User` type from @supabase/supabase-js.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Previously, moving items in the Run of Show would recalculate ALL start
times based on cumulative duration, destroying carefully planned gaps
between items (stage changes, intermissions, etc.).

Now implements smart gap-preserving logic:
- Items with positive gaps (intentional buffers) → gap size preserved
- Items with no gaps or overlaps → auto-adjusted to follow previous item
- Items without start times → calculated automatically
- Item numbers stay sequential after reordering

This allows users to maintain their production timing intentions while
reordering the show flow.

Fixes issue where reordering would mess up all timings.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
The previous implementation had a critical flaw: it compared an item's
old absolute start time with the end time of its new preceding item,
resulting in incorrect gap calculations.

This commit fixes the logic by:

1. Pre-calculating gaps BEFORE reordering
   - Each item's gap is calculated relative to its CURRENT previous item
   - Only positive gaps (intentional buffers) are preserved

2. Storing gap values with each item temporarily

3. After reordering, using the stored gaps to set new start times
   - New start time = previous item's end time + stored gap
   - This preserves the gap size regardless of position

4. Fixing header timing inconsistencies
   - Headers with times earlier than cumulative time are adjusted
   - Prevents misleading header timestamps after reordering

Example fix:
Before: Item with 5-min gap incorrectly calculated as 13-min gap
After: Item correctly maintains its 5-min gap after reordering

Addresses PR code review suggestions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit addresses three critical issues in the reordering logic:

1. Fixed gap calculation to use immediate previous item
   - Previous: Incorrectly accumulated ALL previous items' times
   - Now: Walks backward to find the immediate previous item, skipping headers
   - Example fix: Item with 2-min gap was incorrectly calculated as 7-min gap

2. Preserve absolute schedule offset
   - Previous: Always started recalculation from 00:00:00
   - Now: Finds first item with a time and uses that as the base
   - Benefit: Shows starting at 20:00 (8 PM) maintain that offset after reordering

3. Implement immutable state updates
   - Previous: Mutated items directly in .map() function
   - Now: Creates new objects with updated properties
   - Benefit: Follows React best practices and prevents potential state bugs

Additional improvements:
- Early return for items without start times during gap calculation
- Better header time handling (advance cumulative time if header is ahead)
- Cleaner separation of header vs item logic in recalculation

These changes ensure gaps are correctly preserved, absolute schedule times
are maintained, and React state management follows best practices.

Addresses PR code review suggestions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Fixed TypeScript ESLint violations:
- Removed @typescript-eslint/no-explicit-any errors by properly typing objects
- Removed @typescript-eslint/no-unused-vars errors for destructured calculatedGap

Changes:
- Instead of destructuring to remove calculatedGap, explicitly construct clean
  objects with only the needed properties
- Properly typed itemWithGap as RunOfShowItem & { calculatedGap?: number }
- Added logic to preserve custom column values while excluding calculatedGap

This maintains the same functionality while satisfying strict TypeScript rules.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Updated ImportShowFlowModal.tsx to clarify that start times should be
actual wall-clock times when items/headers occur in the show, not
sequential times starting from 00:00:00.

Changes:
- Field specification: Clarified startTime is absolute show time (e.g., "19:30:00" for 7:30 PM)
- Conversion guidelines: Updated time calculation to use actual wall-clock times
- Examples: Changed from 00:00:00/00:30:00 to realistic times (18:30:00/19:00:00)
- Added explicit note that startTime is NOT relative to show start

This fixes confusion where LLMs would generate shows with all times
starting at midnight instead of actual show times.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
fix: preserve intentional gaps when reordering Run of Show items and others
…itors

Add comprehensive real-time collaboration infrastructure with auto-save,
presence indicators, conflict resolution, and document history tracking.

## Collaboration Infrastructure

### Core Collaboration System
- Add `useCollaboration` hook for real-time broadcast/presence channels
- Add `useAutoSave` hook with optimistic UI and conflict detection
- Add `usePresence` hook for tracking active editors and user presence
- Implement collaboration.ts with Supabase Realtime integration
- Add autoSave.ts with debounced saves and version management
- Add offlineQueue.ts for handling offline edit scenarios

### UI Components
- Add CollaborationToolbar with save status and active users
- Add SaveIndicator with typing/saving/saved states
- Add ActiveUsers presence component with avatars
- Add EditingIndicator for field-level editing status
- Add PresenceIndicator for user activity visualization
- Add DocumentHistory modal with version comparison
- Add ConflictResolution modal for merge conflict handling
- Add VersionDiff component for side-by-side comparisons
- Add Tooltip UI primitive (Radix UI based)

### State Management
- Add collaborativeDocStore (Zustand) for document state
- Add collaboration types for conflicts, history, presence

## Editor Integration

### Real-time Collaboration Enabled
- PatchSheetEditor: Full collaboration with broadcast on all field changes
- StagePlotEditor: Broadcast for elements, stage size, background images
- TheaterMicPlotEditor: Broadcast for actors, name changes
- CorporateMicPlotEditor: Broadcast for presenters, name changes
- RunOfShowEditor: Collaboration toolbar integrated in header
- ProductionScheduleEditor: Auto-save and collaboration support
- All editors: Database real-time subscriptions for cross-client sync

### Shared Edit Link Fixes
- Fix TheaterMicPlotEditor shareCode parameter for anonymous saves
- Fix CorporateMicPlotEditor shareCode parameter for anonymous saves
- Enable anonymous users to save via update_shared_resource RPC
- Prevent 406 errors for shared edit link users

### Infinite Loop Fixes
- Fix PatchSheetOutputs circular dependency (remove ref tracking)
- Match PatchSheetInputs pattern for stable remote updates
- Ensure broadcasts don't trigger save loops with proper change detection

## Database Migrations

### Version Control System
- Add version columns to all document tables
- Add last_edited timestamps for conflict detection
- Add metadata JSONB columns for collaboration data

### History & Activity Tracking
- Create document_history tables for all document types
- Add document_activity table for audit logging
- Add automatic history triggers on document updates
- Enable point-in-time recovery and version comparison

### Collaboration Support Tables
- Add pending_saves table for offline queue
- Add document_locks table for optimistic locking
- Add RLS policies for collaboration features
- Enable realtime replication for all document tables

### Shared Resource Updates
- Add update_shared_resource RPC function with SECURITY DEFINER
- Fix JSONB extraction in RPC for proper field updates
- Enable anonymous users to save via share codes
- Add proper RETURNING clause for version tracking

## Bug Fixes

### Header Component
- Move collaboration toolbar integration to header
- Add collaborationToolbar prop for editor integration
- Match RunOfShowEditor pattern across all editors

### Share Modal
- Update share link generation for collaboration context
- Maintain compatibility with existing share workflows

### Supabase Client
- Configure realtime options for collaboration channels
- Add proper channel cleanup on unmount

## Dependencies
- Add @radix-ui/react-tooltip for collaboration UI
- Update package.json and pnpm-lock.yaml

## Breaking Changes
None - all changes are additive and backward compatible.

## Performance Improvements
- Debounced auto-save (1500ms default) reduces database writes
- Optimistic UI updates for instant feedback
- Broadcast-first architecture for sub-second propagation
- Reference-based change detection prevents unnecessary saves

## Security
- RLS policies prevent unauthorized access to collaboration data
- Share code validation in update_shared_resource RPC
- Version mismatch detection prevents data loss
- Proper authentication checks for all collaboration features

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Major version bump reflecting the addition of comprehensive real-time
collaboration features across all document types.

Changes:
- Updated root package.json from 1.5.6.6 to 2.0.0
- Updated apps/web/package.json from 1.5.6.8 to 2.0.0
- Added comprehensive CHANGELOG entry documenting:
  - Real-time collaboration infrastructure with WebSocket support
  - Shared edit links with anonymous editing capabilities
  - Document versioning and history tracking
  - Collaboration UI components and toolbars
  - Offline support infrastructure
  - Database schema additions (13 migrations)
  - Editor integrations (PatchSheet, StagePlot, TheaterMicPlot, CorporateMicPlot)
  - Bug fixes (infinite loops, 406 errors, JSONB handling)

Note: Capture agent version remains at 0.2.0 (unchanged)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
… Show

Added duplicate functionality and fixed UI issues across Run of Show editor and view modes:

Run of Show Editor (RunOfShowEditor.tsx):
- Added duplicate item feature with Copy icon for all items and headers
- Intelligent item numbering: pure numbers increment (5→6), text appends "(copy)"
- Preserves all fields including custom columns and highlight colors
- Fixed critical bug: item numbers now preserved during reordering (no longer auto-renumbered)
- Fixed sticky section header gap: adjusted from top-[49px] to top-[40px]

Show Mode Pages:
- Fixed sticky header gap in ShowModePage.tsx: adjusted to top-[40px]
- Fixed sticky header gap in SharedShowModePage.tsx: adjusted to top-[40px]

These changes ensure:
✓ Users can duplicate items with all properties intact
✓ Custom item names persist when reordering ("Opening Prayer" stays as-is)
✓ Seamless sticky header behavior across all Run of Show views
✓ Duplicate feature available in both regular and shared edit modes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Fixed critical issue where updating an item's start time or duration
would only recalculate the immediately following item's timing, not
all subsequent items. This left the schedule out of sync.

Root cause: `break` statement in calculateNextCueTime function was
stopping the cascade after updating first item.

Solution: Removed break statement and added cumulative time tracking
to properly cascade timing updates through all following items
(headers and cue items).

Changes:
- Modified calculateNextCueTime function (lines 590-634)
- Removed break statement after updating first following item
- Added cumulativeEndTimeSeconds tracking for proper cascade
- All subsequent items now update when any item timing changes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Enhanced the Show Mode and shared view link pages with better visual
indicators and fixed auto-scroll behavior for live performance use.

Visual improvements:
- Changed next cue indicator from red to orange for better distinction
- Current cue remains green, next cue now orange (more intuitive)
- Updated legend indicators to match new color scheme

Auto-scroll fixes:
- Fixed auto-scroll positioning to account for sticky header heights
- Items now scroll to visible position below all sticky elements
- Added proper offset calculation (89px total: 49px table + 40px section)
- Added 20px padding offset for better visibility

Sticky header layering fixes:
- Fixed multi-line section headers showing through next headers
- Implemented progressive z-index values (z-11, z-12, z-13...)
- Each subsequent header now properly appears on top of previous ones
- Prevents text bleed-through when headers wrap to multiple lines

Changes:
- ShowModePage.tsx: Orange next cue, fixed auto-scroll, z-index layering
- SharedShowModePage.tsx: Same fixes applied for consistency

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Add complete SEO infrastructure with meta tags, structured data, and
automated sitemap generation to improve search engine visibility.

SEO Infrastructure:
- Add automated sitemap generation script (23 URLs with priorities)
- Create reusable SEO utilities (canonical URLs, breadcrumbs, helpers)
- Add SEOHelmet component for consistent meta tag implementation
- Integrate sitemap generation into build process

Structured Data (Schema.org):
- Add Organization schema with GitHub social proof
- Add SoftwareApplication schemas for AcoustIQ Lite & Pro
- Add BreadcrumbList schemas for navigation hierarchy
- Add FAQ schemas (25 questions across 5 categories)
- Remove placeholder rating data to prevent guideline violations

Meta Tags & SEO:
- Add complete meta tags to 10 major pages:
  - Landing, Audio, Video, Lighting, Production pages
  - Analyzer hub, Lite, and Pro pages
  - Resources and Rates pages
- Optimize Landing page description (234→151 chars)
- Add canonical URLs to prevent duplicate content
- Add Open Graph and Twitter Card tags for social sharing
- Add comprehensive keyword targeting

Performance & Technical SEO:
- Add Netlify performance headers (caching, security)
- Add Netlify Lighthouse CI plugin for monitoring
- Optimize robots.txt with 20+ disallow rules for auth-gated content
- Normalize sitemap URLs with trailing slashes
- Remove inaccurate lastmod tags from sitemap

Files Created:
- apps/web/scripts/generate-sitemap.js
- apps/web/src/components/SEOHelmet.tsx
- apps/web/src/utils/canonical-url.ts
- apps/web/src/utils/breadcrumb-schema.ts
- apps/web/src/utils/seo-helpers.ts
- apps/web/src/schemas/organization-schema.ts
- apps/web/src/schemas/software-schemas.ts
- apps/web/src/schemas/faq-schemas.ts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Resolves persistent WebSocket connection failures with robust reconnection logic.

Changes:
- Add useRealtimeSubscription hook with exponential backoff retry strategy
  - Configurable retry attempts (default: 10) and delays (1s → 30s max)
  - Proper channel cleanup before reconnect attempts
  - Jitter to prevent thundering herd problem
- Update SharedShowModePage to use new hook instead of manual subscription
- Add real-time connection status indicator UI:
  - Live (green) - Connected and receiving updates
  - Connecting (blue) - Initial connection attempt
  - Reconnecting (yellow) - Auto-retry in progress with attempt count
  - Offline (gray) - Disconnected
  - Connection failed (red) - Max retries exceeded with manual retry button

Before: WebSocket fails → terminal error → manual page refresh required
After: WebSocket fails → automatic reconnection with visual feedback

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
fix: add automatic WebSocket reconnection for Run of Show viewer
Revert "fix: add automatic WebSocket reconnection for Run of Show vie…
@netlify
Copy link

netlify bot commented Oct 24, 2025

Deploy Preview for incandescent-sfogliatella-f7a090 ready!

Name Link
🔨 Latest commit d43679a
🔍 Latest deploy log https://app.netlify.com/projects/incandescent-sfogliatella-f7a090/deploys/68fba1d594f0dd0008aa0323
😎 Deploy Preview https://deploy-preview-116--incandescent-sfogliatella-f7a090.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@qodo-code-review
Copy link
Contributor

qodo-code-review bot commented Oct 24, 2025

CI Feedback 🧐

(Feedback updated until commit d43679a)

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: typescript-checks

Failed stage: ESLint on changed files [❌]

Failure summary:

The action failed because ESLint reported rule violations in the specified changed files and the
command was run with --max-warnings 0, causing a non-zero exit code.
Examples of blocking errors
include:
- apps/web/src/components/ConflictResolution.tsx:183:3 – documentId is defined but never
used (@typescript-eslint/no-unused-vars)
- apps/web/src/components/Header.tsx:38:36 – Unexpected any
(@typescript-eslint/no-explicit-any)
- apps/web/src/components/History/DocumentHistory.tsx:2:61 –
Filter is defined but never used (@typescript-eslint/no-unused-vars)
- Multiple files contain
numerous no-explicit-any and no-unused-vars errors, among others.
Summary: 219 problems (192 errors,
27 warnings). With --max-warnings 0, any warnings also fail the run, resulting in exit code 1.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

174:  + prettier 3.5.3
175:  + typescript 5.9.2
176:  + typescript-eslint 8.39.1
177:  . prepare$ husky
178:  . prepare: Done
179:  Done in 4s using pnpm v9.15.9
180:  ##[group]Run # Convert comma-separated list to space-separated for ESLint
181:  �[36;1m# Convert comma-separated list to space-separated for ESLint�[0m
182:  �[36;1mFILES="apps/web/src/hooks/useAutoSave.ts,apps/web/src/hooks/useCollaboration.ts,apps/web/src/hooks/usePresence.ts,apps/web/src/lib/autoSave.ts,apps/web/src/lib/collaboration.ts,apps/web/src/lib/lensCalculatorTypes.ts,apps/web/src/lib/lensCalculatorUtils.ts,apps/web/src/lib/lensScoring.enhanced.ts,apps/web/src/lib/lensScoring.ts,apps/web/src/lib/manufacturerNormalization.ts,apps/web/src/lib/mountCompatibility.ts,apps/web/src/lib/offlineQueue.ts,apps/web/src/lib/ustCalculations.ts,apps/web/src/stores/collaborativeDocStore.ts,apps/web/src/types/collaboration.ts,apps/web/src/components/CollaborationToolbar.tsx,apps/web/src/components/ConflictResolution.tsx,apps/web/src/components/HireCJModal.tsx,apps/web/src/components/History/DocumentHistory.tsx,apps/web/src/components/History/VersionDiff.tsx,apps/web/src/components/ImportShowFlowModal.tsx,apps/web/src/components/Presence/ActiveUsers.tsx,apps/web/src/components/Presence/EditingIndicator.tsx,apps/web/src/components/Presence/PresenceIndicator.tsx,apps/web/src/components/SaveIndicator.tsx,apps/web/src/components/TrustedBy.tsx,apps/web/src/components/analyzer/SignalGeneratorSettings.tsx,apps/web/src/components/lens-calculator/ConstraintVisualization.tsx,apps/web/src/components/lens-calculator/LensCalculatorV2Enhanced.tsx,apps/web/src/components/rider/PrintRiderExport.tsx,apps/web/src/components/rider/RiderArtistInfo.tsx,apps/web/src/components/rider/RiderEquipment.tsx,apps/web/src/components/rider/RiderExport.tsx,apps/web/src/components/rider/RiderInputList.tsx,apps/web/src/components/rider/RiderTechnicalStaff.tsx,apps/web/src/components/ui/tooltip.tsx,apps/web/src/pages/AllRiders.tsx,apps/web/src/pages/LensCalculatorPage.tsx,apps/web/src/pages/RiderEditor.tsx,apps/web/src/pages/SharedTechnicalRider.tsx,apps/web/public/lens-calculator-worker.js,apps/web/src/lib/shareUtils.ts,apps/web/src/lib/supabase.ts,apps/web/src/lib/types.ts,packages/analyzer-protocol/src/index.ts,apps/web/src/App.tsx,apps/web/src/components/Footer.tsx,apps/web/src/components/Header.tsx,apps/web/src/components/Hero.tsx,apps/web/src/components/PrintCommsPlanExport.tsx,apps/web/src/components/PrintStagePlotExport.tsx,apps/web/src/components/ShareModal.tsx,apps/web/src/components/WheresCJ.tsx,apps/web/src/components/analyzer/ChartDetailModal.tsx,apps/web/src/components/analyzer/ProSettings.tsx,apps/web/src/components/patch-sheet/PatchSheetInputs.tsx,apps/web/src/components/patch-sheet/PatchSheetOutputs.tsx,apps/web/src/pages/AllCommsPlans.tsx,apps/web/src/pages/AllCorporateMicPlots.tsx,apps/web/src/pages/AllPatchSheets.tsx,apps/web/src/pages/AllProductionSchedules.tsx,apps/web/src/pages/AllRunOfShows.tsx,apps/web/src/pages/AllTheaterMicPlots.tsx,apps/web/src/pages/AnalyzerProPage.tsx,apps/web/src/pages/AudioPage.tsx,apps/web/src/pages/CommsPlannerEditor.tsx,apps/web/src/pages/CorporateMicPlotEditor.tsx,apps/web/src/pages/Landing.tsx,apps/web/src/pages/LedPixelMapEditor.tsx,apps/web/src/pages/PatchSheetEditor.tsx,apps/web/src/pages/ProductionPage.tsx,apps/web/src/pages/ProductionScheduleEditor.tsx,apps/web/src/pages/RunOfShowEditor.tsx,apps/web/src/pages/SharedPatchSheet.tsx,apps/web/src/pages/SharedProductionSchedule.tsx,apps/web/src/pages/SharedShowModePage.tsx,apps/web/src/pages/ShowModePage.tsx,apps/web/src/pages/StagePlotEditor.tsx,apps/web/src/pages/StandardPixelMapEditor.tsx,apps/web/src/pages/TheaterMicPlotEditor.tsx,apps/web/src/pages/VideoCategoryPage.tsx,apps/web/src/pages/VideoPage.tsx,packages/analyzer-lite/src/TransferFunctionVisualizer.tsx,.lintstagedrc.js"�[0m
183:  �[36;1mFILES_ARRAY=$(echo "$FILES" | tr ',' ' ')�[0m
184:  �[36;1m�[0m
185:  �[36;1mecho "Running ESLint on changed files:"�[0m
186:  �[36;1mecho "$FILES_ARRAY" | tr ' ' '\n'�[0m
187:  �[36;1m�[0m
188:  �[36;1m# Run ESLint only on changed files�[0m
189:  �[36;1m# Note: ESLint might need context from imported files, but will only report errors in specified files�[0m
190:  �[36;1mnpx eslint $FILES_ARRAY --max-warnings 0 || EXIT_CODE=$?�[0m
191:  �[36;1m�[0m
192:  �[36;1m# If ESLint found issues, fail the check�[0m
193:  �[36;1mif [ "${EXIT_CODE:-0}" -ne 0 ]; then�[0m
...

274:  apps/web/src/pages/ProductionPage.tsx
275:  apps/web/src/pages/ProductionScheduleEditor.tsx
276:  apps/web/src/pages/RunOfShowEditor.tsx
277:  apps/web/src/pages/SharedPatchSheet.tsx
278:  apps/web/src/pages/SharedProductionSchedule.tsx
279:  apps/web/src/pages/SharedShowModePage.tsx
280:  apps/web/src/pages/ShowModePage.tsx
281:  apps/web/src/pages/StagePlotEditor.tsx
282:  apps/web/src/pages/StandardPixelMapEditor.tsx
283:  apps/web/src/pages/TheaterMicPlotEditor.tsx
284:  apps/web/src/pages/VideoCategoryPage.tsx
285:  apps/web/src/pages/VideoPage.tsx
286:  packages/analyzer-lite/src/TransferFunctionVisualizer.tsx
287:  .lintstagedrc.js
288:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/ConflictResolution.tsx
289:  ##[error]  183:3  error  'documentId' is defined but never used  @typescript-eslint/no-unused-vars
290:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/Header.tsx
291:  ##[error]  38:36  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
292:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/History/DocumentHistory.tsx
293:  ##[error]  2:61  error  'Filter' is defined but never used  @typescript-eslint/no-unused-vars
294:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/Presence/EditingIndicator.tsx
295:  ##[warning]  118:14  warning  Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components  react-refresh/only-export-components
296:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/PrintStagePlotExport.tsx
297:  ##[error]    9:15  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
298:  ##[error]  105:37  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
299:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/ShareModal.tsx
300:  ##[error]   65:19  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
301:  ##[error]   97:19  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
302:  ##[error]  125:19  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
303:  ##[error]  139:19  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
304:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/analyzer/ChartDetailModal.tsx
305:  ##[error]  102:12  error    'first' is assigned a value but never used                                                                                                  @typescript-eslint/no-unused-vars
306:  ##[error]  102:19  error    'second' is assigned a value but never used                                                                                                 @typescript-eslint/no-unused-vars
307:  ##[error]  191:22  error    Unexpected any. Specify a different type                                                                                                    @typescript-eslint/no-explicit-any
308:  ##[error]  198:34  error    Unexpected any. Specify a different type                                                                                                    @typescript-eslint/no-explicit-any
309:  ##[error]  350:14  error    Unexpected any. Specify a different type                                                                                                    @typescript-eslint/no-explicit-any
310:  ##[error]  361:12  error    Unexpected any. Specify a different type                                                                                                    @typescript-eslint/no-explicit-any
311:  ##[warning]  380:6   warning  React Hook useMemo has missing dependencies: 'coherenceAlpha' and 'coherenceThreshold'. Either include them or remove the dependency array  react-hooks/exhaustive-deps
312:  ##[error]  395:24  error    Unexpected any. Specify a different type                                                                                                    @typescript-eslint/no-explicit-any
313:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/analyzer/ProSettings.tsx
314:  ##[error]  13:27  error  Unexpected any. Specify a different type      @typescript-eslint/no-explicit-any
315:  ##[error]  34:16  error  'setNfft' is assigned a value but never used  @typescript-eslint/no-unused-vars
316:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/analyzer/SignalGeneratorSettings.tsx
317:  ##[error]   2:48  error    'ChevronRight' is defined but never used                                                                                                                                                                                                     @typescript-eslint/no-unused-vars
318:  ##[warning]  45:6   warning  React Hook useEffect has a missing dependency: 'onConfigChange'. Either include it or remove the dependency array. If 'onConfigChange' changes too often, find the parent component that defines it and wrap that definition in useCallback  react-hooks/exhaustive-deps
319:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/patch-sheet/PatchSheetInputs.tsx
320:  ##[warning]  191:6   warning  React Hook useEffect has a missing dependency: 'inputs'. Either include it or remove the dependency array                                                                                                                            react-hooks/exhaustive-deps
321:  ##[warning]  250:6   warning  React Hook useEffect has missing dependencies: 'analogSnakeTypes', 'baseDeviceOptions', 'consoleTypeOptions', 'digitalSnakeTypes', 'inputTypeOptions', and 'networkTypeOptions'. Either include them or remove the dependency array  react-hooks/exhaustive-deps
322:  ##[warning]  266:6   warning  React Hook useEffect has a missing dependency: 'editModeInputs'. Either include it or remove the dependency array                                                                                                                    react-hooks/exhaustive-deps
323:  ##[warning]  278:6   warning  React Hook useEffect has a missing dependency: 'updateParentInputs'. Either include it or remove the dependency array                                                                                                                react-hooks/exhaustive-deps
324:  ##[error]  361:83  error    Unexpected any. Specify a different type                                                                                                                                                                                             @typescript-eslint/no-explicit-any
325:  ##[error]  363:22  error    Unexpected any. Specify a different type                                                                                                                                                                                             @typescript-eslint/no-explicit-any
326:  /home/runner/work/sounddocs/sounddocs/apps/web/src/components/patch-sheet/PatchSheetOutputs.tsx
327:  ##[warning]  153:6   warning  React Hook useEffect has a missing dependency: 'outputs'. Either include it or remove the dependency array                                                                                                            react-hooks/exhaustive-deps
328:  ##[warning]  209:6   warning  React Hook useEffect has missing dependencies: 'analogSnakeTypes', 'consoleTypeOptions', 'destinationTypeOptions', 'digitalSnakeTypes', and 'networkTypeOptions'. Either include them or remove the dependency array  react-hooks/exhaustive-deps
329:  ##[warning]  223:6   warning  React Hook useEffect has a missing dependency: 'editModeOutputs'. Either include it or remove the dependency array                                                                                                    react-hooks/exhaustive-deps
330:  ##[warning]  235:6   warning  React Hook useEffect has a missing dependency: 'updateParentOutputs'. Either include it or remove the dependency array                                                                                                react-hooks/exhaustive-deps
331:  ##[error]  315:85  error    Unexpected any. Specify a different type                                                                                                                                                                              @typescript-eslint/no-explicit-any
332:  ##[error]  317:23  error    Unexpected any. Specify a different type                                                                                                                                                                              @typescript-eslint/no-explicit-any
333:  /home/runner/work/sounddocs/sounddocs/apps/web/src/hooks/useAutoSave.ts
334:  ##[error]   17:34  error    Unexpected any. Specify a different type                                                                                                             @typescript-eslint/no-explicit-any
335:  ##[error]   65:54  error    Unexpected any. Specify a different type                                                                                                             @typescript-eslint/no-explicit-any
336:  ##[error]  165:36  error    Unexpected any. Specify a different type                                                                                                             @typescript-eslint/no-explicit-any
337:  ##[error]  312:51  error    Unexpected any. Specify a different type                                                                                                             @typescript-eslint/no-explicit-any
338:  ##[error]  312:71  error    Unexpected any. Specify a different type                                                                                                             @typescript-eslint/no-explicit-any
339:  ##[warning]  407:5   warning  React Hook useCallback has unnecessary dependencies: 'documentId', 'documentType', and 'userId'. Either exclude them or remove the dependency array  react-hooks/exhaustive-deps
340:  ##[error]  438:53  error    Unexpected any. Specify a different type                                                                                                             @typescript-eslint/no-explicit-any
341:  ##[error]  438:73  error    Unexpected any. Specify a different type                                                                                                             @typescript-eslint/no-explicit-any
342:  ##[error]  561:28  error    Unexpected any. Specify a different type                                                                                                             @typescript-eslint/no-explicit-any
343:  ##[error]  600:57  error    Unexpected any. Specify a different type                                                                                                             @typescript-eslint/no-explicit-any
344:  ##[error]  600:77  error    Unexpected any. Specify a different type                                                                                                             @typescript-eslint/no-explicit-any
345:  /home/runner/work/sounddocs/sounddocs/apps/web/src/hooks/useCollaboration.ts
346:  172:5  warning  Unused eslint-disable directive (no problems were reported from 'react-hooks/exhaustive-deps')
347:  ##[warning]  174:6  warning  React Hook useEffect has missing dependencies: 'channels' and 'onRemoteUpdate'. Either include them or remove the dependency array. If 'onRemoteUpdate' changes too often, find the parent component that defines it and wrap that definition in useCallback  react-hooks/exhaustive-deps
348:  /home/runner/work/sounddocs/sounddocs/apps/web/src/lib/autoSave.ts
349:  ##[error]   92:46  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
350:  ##[error]   92:56  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
351:  ##[error]  171:38  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
352:  ##[error]  248:40  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
353:  ##[error]  401:28  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
354:  /home/runner/work/sounddocs/sounddocs/apps/web/src/lib/collaboration.ts
355:  ##[error]  157:51  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
356:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/AnalyzerProPage.tsx
357:  ##[error]   20:31  error    'useMemo' is defined but never used                                                                                   @typescript-eslint/no-unused-vars
358:  ##[warning]  168:6   warning  React Hook useEffect has a missing dependency: 'fetchMeasurements'. Either include it or remove the dependency array  react-hooks/exhaustive-deps
359:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/CommsPlannerEditor.tsx
360:  ##[error]   204:5   error    'broadcast' is assigned a value but never used                                                                          @typescript-eslint/no-unused-vars
361:  ##[error]   223:11  error    'setEditingField' is assigned a value but never used                                                                    @typescript-eslint/no-unused-vars
362:  ##[error]   252:21  error    'version' is assigned a value but never used                                                                            @typescript-eslint/no-unused-vars
363:  ##[error]   252:30  error    'last_edited' is assigned a value but never used                                                                        @typescript-eslint/no-unused-vars
364:  ##[error]   252:43  error    'metadata' is assigned a value but never used                                                                           @typescript-eslint/no-unused-vars
365:  ##[error]   252:94  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
366:  ##[error]   266:75  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
367:  ##[warning]   318:6   warning  React Hook useEffect has a missing dependency: 'handleSave'. Either include it or remove the dependency array           react-hooks/exhaustive-deps
368:  ##[error]   744:69  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
369:  ##[error]   752:68  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
370:  ##[error]   764:25  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
371:  ##[error]   976:42  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
372:  ##[error]  1007:21  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
373:  ##[error]  1033:54  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
374:  ##[error]  1054:66  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
375:  ##[error]  1075:21  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
376:  ##[warning]  1086:6   warning  React Hook useEffect has a missing dependency: 'fetchVersionHistory'. Either include it or remove the dependency array  react-hooks/exhaustive-deps
377:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/CorporateMicPlotEditor.tsx
378:  ##[error]    4:10  error    'useAuth' is defined but never used                                                                                     @typescript-eslint/no-unused-vars
379:  ##[error]   42:36  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
380:  ##[error]  124:23  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
381:  ##[error]  193:27  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
382:  ##[error]  202:11  error    'setEditingField' is assigned a value but never used                                                                    @typescript-eslint/no-unused-vars
383:  ##[error]  246:21  error    'version' is assigned a value but never used                                                                            @typescript-eslint/no-unused-vars
384:  ##[error]  246:30  error    'last_edited' is assigned a value but never used                                                                        @typescript-eslint/no-unused-vars
385:  ##[error]  246:43  error    'metadata' is assigned a value but never used                                                                           @typescript-eslint/no-unused-vars
386:  ##[error]  246:94  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
387:  ##[error]  247:31  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
388:  ##[error]  318:82  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
389:  ##[error]  431:21  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
390:  ##[error]  473:42  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
391:  ##[error]  504:21  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
392:  ##[error]  530:54  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
393:  ##[error]  557:21  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
394:  ##[warning]  568:6   warning  React Hook useEffect has a missing dependency: 'fetchVersionHistory'. Either include it or remove the dependency array  react-hooks/exhaustive-deps
395:  ##[error]  593:9   error    'isOwner' is assigned a value but never used                                                                            @typescript-eslint/no-unused-vars
396:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/PatchSheetEditor.tsx
397:  ##[error]   73:48  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
398:  ##[error]   79:10  error  'shareLink' is assigned a value but never used        @typescript-eslint/no-unused-vars
399:  ##[error]   79:46  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
400:  ##[error]  195:30  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
401:  ##[error]  222:11  error  'setEditingField' is assigned a value but never used  @typescript-eslint/no-unused-vars
402:  ##[error]  324:26  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
403:  ##[error]  333:25  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
404:  ##[error]  400:26  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
405:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/ProductionScheduleEditor.tsx
406:  ##[error]    1:38  error    'useMemo' is defined but never used                                                                                             @typescript-eslint/no-unused-vars
407:  ##[warning]   66:14  warning  Fast refresh only works when a file only exports components. Use a new file to share constants or functions between components  react-refresh/only-export-components
408:  ##[error]  210:5   error    'broadcast' is assigned a value but never used                                                                                  @typescript-eslint/no-unused-vars
409:  ##[error]  221:28  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
410:  ##[error]  230:11  error    'setEditingField' is assigned a value but never used                                                                            @typescript-eslint/no-unused-vars
411:  ##[error]  262:21  error    'version' is assigned a value but never used                                                                                    @typescript-eslint/no-unused-vars
412:  ##[error]  262:30  error    'last_edited' is assigned a value but never used                                                                                @typescript-eslint/no-unused-vars
413:  ##[error]  262:43  error    'metadata' is assigned a value but never used                                                                                   @typescript-eslint/no-unused-vars
414:  ##[error]  262:94  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
415:  ##[error]  263:32  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
416:  ##[error]  368:90  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
417:  ##[error]  385:25  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
418:  ##[error]  441:88  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
419:  ##[warning]  465:6   warning  React Hook useEffect has a missing dependency: 'user'. Either include it or remove the dependency array                         react-hooks/exhaustive-deps
420:  ##[error]  621:33  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
421:  ##[error]  659:89  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
422:  ##[error]  674:21  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
423:  ##[error]  716:42  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
424:  ##[error]  747:21  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
425:  ##[error]  773:54  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
426:  ##[error]  800:21  error    Unexpected any. Specify a different type                                                                                        @typescript-eslint/no-explicit-any
427:  ##[warning]  811:6   warning  React Hook useEffect has a missing dependency: 'fetchVersionHistory'. Either include it or remove the dependency array          react-hooks/exhaustive-deps
428:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/RiderEditor.tsx
429:  ##[error]  139:5   error    'broadcast' is assigned a value but never used                                                                          @typescript-eslint/no-unused-vars
430:  ##[error]  150:25  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
431:  ##[error]  159:11  error    'setEditingField' is assigned a value but never used                                                                    @typescript-eslint/no-unused-vars
432:  ##[error]  188:21  error    'version' is assigned a value but never used                                                                            @typescript-eslint/no-unused-vars
433:  ##[error]  188:30  error    'last_edited' is assigned a value but never used                                                                        @typescript-eslint/no-unused-vars
434:  ##[error]  188:43  error    'metadata' is assigned a value but never used                                                                           @typescript-eslint/no-unused-vars
435:  ##[error]  188:94  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
436:  ##[error]  189:29  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
437:  ##[error]  299:25  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
438:  ##[warning]  375:6   warning  React Hook useEffect has a missing dependency: 'user'. Either include it or remove the dependency array                 react-hooks/exhaustive-deps
439:  ##[error]  432:33  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
440:  ##[error]  472:21  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
441:  ##[error]  514:42  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
442:  ##[error]  545:21  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
443:  ##[error]  571:54  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
444:  ##[error]  598:21  error    Unexpected any. Specify a different type                                                                                @typescript-eslint/no-explicit-any
445:  ##[warning]  609:6   warning  React Hook useEffect has a missing dependency: 'fetchVersionHistory'. Either include it or remove the dependency array  react-hooks/exhaustive-deps
446:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/RunOfShowEditor.tsx
447:  ##[error]  31:10  error  'CollaborationToolbar' is defined but never used  @typescript-eslint/no-unused-vars
448:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/SharedPatchSheet.tsx
449:  ##[error]    5:3   error  'ArrowLeft' is defined but never used                   @typescript-eslint/no-unused-vars
450:  ##[error]    6:3   error  'Download' is defined but never used                    @typescript-eslint/no-unused-vars
451:  ##[error]   17:29  error  'updateSharedResource' is defined but never used        @typescript-eslint/no-unused-vars
452:  ##[error]   18:10  error  'supabase' is defined but never used                    @typescript-eslint/no-unused-vars
453:  ##[error]   46:9   error  'navigate' is assigned a value but never used           @typescript-eslint/no-unused-vars
454:  ##[error]   50:48  error  Unexpected any. Specify a different type                @typescript-eslint/no-explicit-any
455:  ##[error]   51:46  error  Unexpected any. Specify a different type                @typescript-eslint/no-explicit-any
456:  ##[error]   53:10  error  'downloadingSheet' is assigned a value but never used   @typescript-eslint/no-unused-vars
457:  ##[error]   72:30  error  Unexpected any. Specify a different type                @typescript-eslint/no-explicit-any
458:  ##[error]  101:23  error  Unexpected any. Specify a different type                @typescript-eslint/no-explicit-any
459:  ##[error]  112:9   error  'handleExportClick' is assigned a value but never used  @typescript-eslint/no-unused-vars
460:  ##[error]  218:59  error  Unexpected any. Specify a different type                @typescript-eslint/no-explicit-any
461:  ##[error]  340:39  error  Unexpected any. Specify a different type                @typescript-eslint/no-explicit-any
462:  ##[error]  342:27  error  'linkedChannel' is assigned a value but never used      @typescript-eslint/no-unused-vars
463:  ##[error]  466:41  error  Unexpected any. Specify a different type                @typescript-eslint/no-explicit-any
464:  ##[error]  468:27  error  'linkedChannel' is assigned a value but never used      @typescript-eslint/no-unused-vars
465:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/SharedShowModePage.tsx
466:  ##[error]  79:21  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
467:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/ShowModePage.tsx
468:  ##[error]   29:20  error    Unexpected any. Specify a different type                                                                        @typescript-eslint/no-explicit-any
469:  ##[error]   71:40  error    Unexpected any. Specify a different type                                                                        @typescript-eslint/no-explicit-any
470:  ##[error]  137:80  error    Unexpected any. Specify a different type                                                                        @typescript-eslint/no-explicit-any
471:  ##[error]  159:21  error    Unexpected any. Specify a different type                                                                        @typescript-eslint/no-explicit-any
472:  ##[warning]  209:6   warning  React Hook useEffect has a missing dependency: 'itemTimerId'. Either include it or remove the dependency array  react-hooks/exhaustive-deps
473:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/StagePlotEditor.tsx
474:  ##[error]  117:82  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
475:  ##[error]  132:46  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
476:  ##[error]  242:31  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
477:  ##[error]  254:31  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
478:  ##[error]  264:11  error    'setEditingField' is assigned a value but never used                                                           @typescript-eslint/no-unused-vars
479:  ##[error]  296:21  error    'version' is assigned a value but never used                                                                   @typescript-eslint/no-unused-vars
480:  ##[error]  296:30  error    'last_edited' is assigned a value but never used                                                               @typescript-eslint/no-unused-vars
481:  ##[error]  296:43  error    'metadata' is assigned a value but never used                                                                  @typescript-eslint/no-unused-vars
482:  ##[error]  296:94  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
483:  ##[error]  299:33  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
484:  ##[warning]  347:6   warning  React Hook useEffect has a missing dependency: 'handleSave'. Either include it or remove the dependency array  react-hooks/exhaustive-deps
485:  ##[error]  354:56  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
486:  ##[error]  356:43  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
487:  ##[error]  405:18  error    'error' is defined but never used                                                                              @typescript-eslint/no-unused-vars
488:  ##[error]  405:25  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
489:  ##[error]  464:18  error    'error' is defined but never used                                                                              @typescript-eslint/no-unused-vars
490:  ##[error]  707:77  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
491:  ##[error]  738:47  error    'icon' is defined but never used                                                                               @typescript-eslint/no-unused-vars
492:  ##[error]  789:21  error    Unexpected any. Specify a different type                                                                       @typescript-eslint/no-explicit-any
493:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/StandardPixelMapEditor.tsx
494:  ##[error]   41:14  error    Unexpected any. Specify a different type                                                                 @typescript-eslint/no-explicit-any
495:  ##[error]  130:5   error    'broadcast' is assigned a value but never used                                                           @typescript-eslint/no-unused-vars
496:  ##[error]  141:27  error    Unexpected any. Specify a different type                                                                 @typescript-eslint/no-explicit-any
497:  ##[error]  146:11  error    'setEditingField' is assigned a value but never used                                                     @typescript-eslint/no-unused-vars
498:  ##[error]  178:21  error    'version' is assigned a value but never used                                                             @typescript-eslint/no-unused-vars
499:  ##[error]  178:30  error    'last_edited' is assigned a value but never used                                                         @typescript-eslint/no-unused-vars
500:  ##[error]  178:43  error    'metadata' is assigned a value but never used                                                            @typescript-eslint/no-unused-vars
501:  ##[error]  178:94  error    Unexpected any. Specify a different type                                                                 @typescript-eslint/no-explicit-any
502:  ##[error]  179:31  error    Unexpected any. Specify a different type                                                                 @typescript-eslint/no-explicit-any
503:  ##[error]  191:32  error    Unexpected any. Specify a different type                                                                 @typescript-eslint/no-explicit-any
504:  ##[error]  310:25  error    Unexpected any. Specify a different type                                                                 @typescript-eslint/no-explicit-any
505:  ##[warning]  391:6   warning  React Hook useEffect has a missing dependency: 'user'. Either include it or remove the dependency array  react-hooks/exhaustive-deps
506:  ##[error]  420:22  error    Unexpected any. Specify a different type                                                                 @typescript-eslint/no-explicit-any
507:  ##[error]  473:21  error    Unexpected any. Specify a different type                                                                 @typescript-eslint/no-explicit-any
508:  ##[error]  518:18  error    'e' is defined but never used                                                                            @typescript-eslint/no-unused-vars
509:  ##[error]  534:19  error    Unexpected any. Specify a different type                                                                 @typescript-eslint/no-explicit-any
510:  ##[error]  696:25  error    'resolution' is defined but never used                                                                   @typescript-eslint/no-unused-vars
511:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/TheaterMicPlotEditor.tsx
512:  ##[error]    1:38  error  'useMemo' is defined but never used                   @typescript-eslint/no-unused-vars
513:  ##[error]   21:3   error  'verifyShareLink' is defined but never used           @typescript-eslint/no-unused-vars
514:  ##[error]  124:27  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
515:  ##[error]  129:11  error  'setEditingField' is assigned a value but never used  @typescript-eslint/no-unused-vars
516:  ##[error]  158:21  error  'version' is assigned a value but never used          @typescript-eslint/no-unused-vars
517:  ##[error]  158:30  error  'last_edited' is assigned a value but never used      @typescript-eslint/no-unused-vars
518:  ##[error]  158:43  error  'metadata' is assigned a value but never used         @typescript-eslint/no-unused-vars
519:  ##[error]  158:94  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
520:  ##[error]  159:31  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
521:  ##[error]  206:25  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
522:  ##[error]  316:74  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
523:  ##[error]  414:21  error  Unexpected any. Specify a different type              @typescript-eslint/no-explicit-any
524:  ##[error]  611:25  error  'resolution' is defined but never used                @typescript-eslint/no-unused-vars
525:  /home/runner/work/sounddocs/sounddocs/apps/web/src/pages/VideoCategoryPage.tsx
526:  ##[error]   17:3  error    'Clapperboard' is defined but never used                                                              @typescript-eslint/no-unused-vars
527:  ##[error]   19:3  error    'Minimize' is defined but never used                                                                  @typescript-eslint/no-unused-vars
528:  ##[warning]  131:6  warning  React Hook useMemo has a missing dependency: 'gcd'. Either include it or remove the dependency array  react-hooks/exhaustive-deps
529:  /home/runner/work/sounddocs/sounddocs/apps/web/src/stores/collaborativeDocStore.ts
530:  ##[error]  37:32  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
531:  ##[error]  61:21  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
532:  /home/runner/work/sounddocs/sounddocs/apps/web/src/types/collaboration.ts
533:  ##[error]   43:39  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
534:  ##[error]   66:37  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
535:  ##[error]  120:39  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
536:  ##[error]  150:28  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
537:  ##[error]  261:24  error  Unexpected any. Specify a different type  @typescript-eslint/no-explicit-any
538:  ✖ 219 problems (192 errors, 27 warnings)
539:  0 errors and 1 warning potentially fixable with the `--fix` option.
540:  ❌ ESLint found issues in changed files
541:  ##[error]Process completed with exit code 1.
542:  Post job cleanup.

@netlify
Copy link

netlify bot commented Oct 24, 2025

Deploy Preview for sounddocsbeta ready!

Name Link
🔨 Latest commit d43679a
🔍 Latest deploy log https://app.netlify.com/projects/sounddocsbeta/deploys/68fba1d570aab50009a2ff2f
😎 Deploy Preview https://deploy-preview-116--sounddocsbeta.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@qodo-code-review
Copy link
Contributor

PR Compliance Guide 🔍

Below is a summary of compliance checks for this PR:

Security Compliance
Client trust boundary

Description: The use of crypto.randomUUID() to generate client-side IDs for updates without
authentication/authorization checks in the same module relies on downstream services for
security; ensure server-side validation and authorization of updates to prevent spoofed
userId or tampered updates.
collaborativeDocStore.ts [205-233]

Referred Code
set((state) => ({
  documentData: { ...state.documentData, [field]: value },
  saveStatus: "typing",
  saveError: null,
}));

// Create update object
const update: DocumentUpdate = {
  id: crypto.randomUUID(),
  documentId,
  documentType,
  field,
  value,
  previousValue: state.documentData[field],
  userId,
  timestamp: new Date().toISOString(),
  version: state.documentVersion,
  persisted: false,
};

// Add to pending updates



 ... (clipped 8 lines)
Data access control

Description: Supabase queries use ilike with user-provided manufacturer filters which is safe
parameterized in Supabase, but ensure RLS and authorization are enforced server-side to
prevent data exfiltration via overly broad selects.
lensCalculatorUtils.ts [35-56]

Referred Code
let query = supabase.from("projector_database").select("*");

if (filters?.manufacturer) {
  // Use case-insensitive manufacturer comparison
  query = query.filter("manufacturer", "ilike", filters.manufacturer);
}
if (filters?.resolution) {
  query = query.eq("native_resolution", filters.resolution);
}
if (filters?.minBrightness) {
  query = query.gte("brightness_ansi", filters.minBrightness);
}

const { data, error } = await query.order("manufacturer").order("model");

if (error) {
  console.error("Error fetching projectors:", error);
  return [];
}

return data || [];



 ... (clipped 1 lines)
Silent error handling

Description: Buffer overflow condition is silently ignored (replacing warning with pass), which can
mask degraded or corrupted data paths and could be abused for denial-of-service or silent
data integrity issues.
audio.py [46-50]

Referred Code
# The `read` method returns a tuple (data, overflowed_boolean)
data, overflowed = self.stream.read(self.config.blockSize)
if overflowed:
    pass  # Buffer overflow tracked
yield data
Ticket Compliance
🎫 No ticket provided
- [ ] Create ticket/issue <!-- /create_ticket --create_ticket=true -->

</details></td></tr>
Codebase Duplication Compliance
Codebase context is not defined

Follow the guide to enable codebase context checks.

Custom Compliance
No custom compliance provided

Follow the guide to enable custom compliance check.

Compliance status legend 🟢 - Fully Compliant
🟡 - Partial Compliant
🔴 - Not Compliant
⚪ - Requires Further Human Verification
🏷️ - Compliance label

@cj-vana cj-vana merged commit 09db68c into main Oct 24, 2025
10 of 13 checks passed
@qodo-code-review
Copy link
Contributor

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
Possible issue
Fix ignored user presence state updates

Remove the flawed re-render prevention logic in setActiveUsers and simply update
the state with the new otherUsers array to ensure all presence changes are
reflected.

apps/web/src/hooks/useCollaboration.ts [115-133]

-// Only update if users have actually changed (avoid unnecessary re-renders)
-setActiveUsers((prevUsers) => {
-  // Compare user IDs to detect changes
-  const prevUserIds = prevUsers
-    .map((u) => u.userId)
-    .sort()
-    .join(",");
-  const newUserIds = otherUsers
-    .map((u) => u.userId)
-    .sort()
-    .join(",");
+// The component will re-render only if `otherUsers` is a new array instance
+// with different content, which is the desired behavior.
+setActiveUsers(otherUsers);
 
-  // If same users, return previous reference
-  if (prevUserIds === newUserIds) {
-    return prevUsers;
-  }
-
-  return otherUsers;
-});
-

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 10

__

Why: This suggestion correctly identifies a major flaw in the state update logic that would prevent user presence updates (like cursor movements) from being rendered, defeating a core purpose of the feature.

High
Fix incorrect UST lens classification

Correct the misclassification of Epson "ELPLX" lenses by moving the check from
the zero_offset logic block to the negative_offset block to align with the
documented behavior.

apps/web/src/lib/ustCalculations.ts [232-254]

 // Check for zero-offset indicators
 if (
   lens.optical_features?.zero_offset === true ||
-  (lens.manufacturer === "Epson" && lens.model.includes("ELPLX")) ||
-  (lens.manufacturer === "Barco" && lens.throw_ratio_max < 0.38)
+  (lens.manufacturer === "Barco" && lens.throw_ratio_max < 0.38) ||
+  (lens.manufacturer === "Epson" && lens.model.includes("Zero Offset"))
 ) {
   ustType = "zero_offset";
   restrictions.push("No vertical lens shift available");
   restrictions.push("Projector must be precisely at screen bottom");
   restrictions.push("Any vertical misalignment causes image distortion");
   shiftLimitations.push("Zero vertical shift capability");
 
   specialRequirements.push("Micro-positioning mounting hardware required");
   specialRequirements.push("Professional installation recommended");
 } else if (
   lens.optical_features?.negative_offset === true ||
-  (lens.manufacturer === "Epson" && lens.model.includes("Zero Offset"))
+  (lens.manufacturer === "Epson" && lens.model.includes("ELPLX"))
 ) {
   ustType = "negative_offset";
   restrictions.push("Designed for below-screen mounting only");
   restrictions.push("Limited upward adjustment capability");
   shiftLimitations.push("Negative offset design limits positioning");
 } else if (lens.optical_features?.mirror_lens === true) {

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 9

__

Why: This suggestion identifies a clear logical contradiction between the code and a comment, which leads to a bug in lens classification and subsequent incorrect calculations.

High
Fix bug with cursor position reporting

Replace the logical OR (||) with the nullish coalescing operator (??) when
setting cursorPosition to correctly handle a position of 0.

apps/web/src/hooks/usePresence.ts [110-113]

 sendPresenceUpdate({
-  editingField: field || undefined,
-  cursorPosition: position || undefined,
+  editingField: field ?? undefined,
+  cursorPosition: position ?? undefined,
 });

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 9

__

Why: The suggestion correctly identifies a critical bug where a cursor position of 0 is incorrectly treated as falsy, breaking presence tracking. The proposed fix using the nullish coalescing operator (??) is the correct solution.

High
Fix incorrect lens shift validation

Modify the shiftOK function to correctly return true when no lens shift is
required, regardless of the lens's shift capabilities, to prevent incorrect
filtering.

apps/web/src/lib/lensCalculatorUtils.ts [252-259]

 export function shiftOK(vReq: number, hReq: number, vMax: number = 0, hMax: number = 0): boolean {
+  // If no shift is required, it's always OK.
+  if (vReq === 0 && hReq === 0) return true;
+
+  // If shift is required but the lens has no shift capability, it's not OK.
   if (!vMax && !hMax) return false;
 
   // Use ellipse equation: (v/vMax)² + (h/hMax)² ≤ 1
   const vv = vMax ? (vReq / vMax) ** 2 : 0;
   const hh = hMax ? (hReq / hMax) ** 2 : 0;
   return vv + hh <= 1.0;
 }

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 8

__

Why: The suggestion correctly identifies and fixes a bug where the shiftOK function would incorrectly return false for a lens with no shift capability when no shift is required, leading to valid lenses being filtered out.

Medium
Implement missing environmental scoring logic

Add missing scoring logic for humidity and dust level to the
scoreEnvironmentalSuitability function to ensure a complete and accurate
environmental compatibility assessment.

apps/web/src/lib/lensScoring.enhanced.ts [969-1019]

 function scoreEnvironmentalSuitability(
   context: EnhancedScoringContext,
   profile: EnhancedScoringProfile,
 ): {
   score: number;
   factors: string[];
   warnings: string[];
 } {
   let score = 100;
   const factors: string[] = [];
   const warnings: string[] = [];
 
   const envConditions = context.environmentalConditions;
   const envFactors = profile.environmentalFactors;
 
   if (envConditions) {
     // Indoor/outdoor suitability
     if (envConditions.indoor && !envFactors.indoorOptimal) {
       score -= profile.penalties.environmentalMismatch;
       warnings.push("Lens not optimized for indoor use");
     } else if (!envConditions.indoor && !envFactors.outdoorCapable) {
       score -= profile.penalties.environmentalMismatch * 2;
       warnings.push("Lens not suitable for outdoor use");
     }
 
     // Temperature compatibility
-    if (envConditions.temperature) {
+    if (typeof envConditions.temperature === "number") {
       if (
         envConditions.temperature < envFactors.temperatureRange.min ||
         envConditions.temperature > envFactors.temperatureRange.max
       ) {
         score -= profile.penalties.environmentalMismatch;
         warnings.push("Operating temperature outside lens specifications");
+      }
+    }
+
+    // Humidity compatibility
+    if (typeof envConditions.humidity === "number") {
+      if (envConditions.humidity > envFactors.humidityTolerance) {
+        score -= profile.penalties.environmentalMismatch;
+        warnings.push("Operating humidity exceeds lens tolerance");
+      }
+    }
+
+    // Dust resistance compatibility
+    if (envConditions.dustLevel) {
+      const dustResistanceMap = { low: 1, medium: 2, high: 3 };
+      const requiredResistance = dustResistanceMap[envConditions.dustLevel];
+      const lensResistance = dustResistanceMap[envFactors.dustResistance];
+      if (lensResistance < requiredResistance) {
+        score -= profile.penalties.environmentalMismatch;
+        warnings.push("Lens dust resistance is insufficient for the environment");
       }
     }
 
     // Add positive factors
     if (envConditions.indoor && envFactors.indoorOptimal) {
       factors.push("Indoor optimized");
     }
     if (!envConditions.indoor && envFactors.outdoorCapable) {
       factors.push("Outdoor capable");
     }
   }
 
   return {
     score: Math.max(0, score),
     factors,
     warnings,
   };
 }

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies that the scoreEnvironmentalSuitability function omits checks for humidity and dust, leading to an incomplete and inaccurate score, and the proposed fix completes the logic as intended by the surrounding types.

Medium
General
Consolidate duplicated adapter data sources

Remove the findAdapterSolution function and its ADAPTER_DATABASE to eliminate
duplicated adapter information, consolidating all compatibility data into the
MOUNT_COMPATIBILITY_MATRIX.

apps/web/src/lib/mountCompatibility.ts [508-554]

-function findAdapterSolution(
-  projMount: string,
-  lensMount: string,
-): {
-  partNumber: string;
-  cost: number;
-  limitations: string[];
-} | null {
-  const ADAPTER_DATABASE = [
-    {
-      from: "TLD",
-      to: "TLD+",
-      partNumber: "R9801410",
-      cost: 450,
-      limitations: ["Manual focus only", "No lens memory"],
-    },
-    {
-      from: "CT",
-      to: "ILS",
-      partNumber: "108-499101-01",
-      cost: 750,
-      limitations: ["No automatic lens recognition", "Manual calibration required"],
-    },
-    {
-      from: "XLD",
-      to: "XLD+",
-      partNumber: "R9801247",
-      cost: 650,
-      limitations: ["Reduced shift range", "Manual calibration required"],
-    },
-    {
-      from: "Manual",
-      to: "ILS",
-      partNumber: "108-499103-01",
-      cost: 550,
-      limitations: ["Motorized functions not available", "Manual operation only"],
-    },
-  ];
+// This function should be removed entirely.
+// The logic to find adapters should be integrated into `checkMountCompatibility`
+// by iterating through `MOUNT_COMPATIBILITY_MATRIX`.
 
-  return (
-    ADAPTER_DATABASE.find(
-      (adapter) =>
-        (adapter.from === lensMount && adapter.to === projMount) ||
-        (adapter.from === projMount && adapter.to === lensMount),
-    ) || null
-  );
-}
-

[To ensure code accuracy, apply this suggestion manually]

Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies that ADAPTER_DATABASE duplicates data from MOUNT_COMPATIBILITY_MATRIX, which is a significant maintainability and code quality issue.

Medium
  • More

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant